/**
 * @file bsp_gpio.h
 * @author 何传喜
 * @brief GPIO 通用操作头文件
 * @version 0.2
 * @date 2023-08-31
 * @note 2023-08-31 初版
 *       2023-09-08 添加 GPIO 中断相关定义
 * @copyright Copyright (c) 2023
 * 
 */
#ifndef __BSP_GPIO_H
#define __BSP_GPIO_H

#include "imx6ul.h"

/* 枚举类型和结构体定义 */
typedef enum _gpio_pin_direction
{
    kGPIO_DigitalInput  = 0U, /* 输入 */
    kGPIO_DigitalOutput = 1U, /* 输出 */
} gpio_pin_direction_t;

/* GPIO 中断触发类型枚举 */
typedef enum _gpio_interrupt_mode
{
    kGPIO_NoIntMode              = 0U, /* 无中断功能 */
    kGPIO_IntLowLevel            = 1U, /* 低电平触发 */
    kGPIO_IntHighLevel           = 2U, /* 高电平触发 */
    kGPIO_IntRisingEdge          = 3U, /* 上升沿触发 */
    kGPIO_IntFallingEdge         = 4U, /* 下降沿触发 */
    kGPIO_IntRisingOrFallingEdge = 5U, /* 上升沿和下降沿都触发 */
} gpio_interrupt_mode_t;

/* GPIO 配置结构体 */
typedef struct _gpio_pin_config
{
    gpio_pin_direction_t direction; /* GPIO 方向：输入或输出 */
    uint8_t outputLogic; /* 默认输出电平 */
    gpio_interrupt_mode_t interruptMode; /* 中断触发方式 */
} gpio_pin_config_t;

/* 函数声明 */
void gpio_init(GPIO_Type *base, int pin, gpio_pin_config_t *config);
int gpio_pinread(GPIO_Type *base, int pin);
void gpio_pinwrite(GPIO_Type *base, int pin, int value);
void gpio_intconfig(GPIO_Type *base, unsigned int pin, 
                    gpio_interrupt_mode_t pinInterruptMode);
void gpio_enableint(GPIO_Type *base, unsigned int pin);
void gpio_disableint(GPIO_Type *base, unsigned int pin);
void gpio_clearintflags(GPIO_Type *base, unsigned int pin);

#endif
